﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;

namespace Example2.Model
{
    class Pad
    {
        /**
         * Paddens position i modellkoordinater
         * Anger paddens mittposition
         * 
         *  ------*------
         */
        public Vector2 m_centerTopPosition = new Vector2(Level.LEVEL_WIDTH / 2, Level.LEVEL_WIDTH -1 );

        //bredd i modellkoordinater 1 / 5 av spelytan
        private float m_padwidth = Level.LEVEL_WIDTH / 5;

        //hastighet i modellkoordinater per sekund. Negativ betyder rörelse åt vänster positiv åt höger
        private float m_speed = 0;

        //Angivet i modellkoordinater per sekund ~ hela skärmen på 0.5s
        private const int PAD_SPEED = Level.LEVEL_WIDTH * 2; 

        internal void Update(float a_elapsedTimeSeconds)
        {

            //Regler för paddens rörelser
            m_centerTopPosition.X += a_elapsedTimeSeconds * m_speed;

            if (m_centerTopPosition.X < m_padwidth / 2.0f)
            {
                m_centerTopPosition.X = m_padwidth / 2.0f;
            }
            if (m_centerTopPosition.X > Level.LEVEL_WIDTH - m_padwidth / 2.0f)
            {
                m_centerTopPosition.X = Level.LEVEL_WIDTH - m_padwidth / 2.0f;
            }
        }

        internal bool isBallAndPadColliding(Vector2 a_centerPosition, float a_radius)
        {
            //om bollen är för långt åt vänster
            if (a_centerPosition.X + a_radius < m_centerTopPosition.X - GetWidth() / 2)
            {
                return false;
            }
            if (a_centerPosition.X - a_radius > m_centerTopPosition.X + GetWidth() / 2)
            {
                return false;
            }
            if (a_centerPosition.Y + a_radius < m_centerTopPosition.Y)
            {
                return false;
            }
            if (a_centerPosition.Y - a_radius > m_centerTopPosition.Y + 0.5f)
            {
                return false;
            }
            return true;
        }

        
        /**
         * Publikt interface för att hämta paddens storlek
         */
        internal float GetWidth()
        {
            return m_padwidth; 
        }


        //Följande metoder är de order spelaren kan ge
        internal void GoLeft()
        {
            m_speed = -PAD_SPEED; //Vänster
        }

        internal void GoRight()
        {
            m_speed = PAD_SPEED; //Höger
        }

        internal void Stop()
        {
            m_speed = 0.0f; 
        }

        internal Vector2 getNormalAt(Vector2 ballPosition)
        {
            
            float dist = ballPosition.X - m_centerTopPosition.X;

            dist /= m_padwidth;
            Vector2 ret = new Vector2(dist * dist, -1);
            ret.Normalize();

            return ret;
        }
    }
}
